home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 2010 April
/
PCWorld0410.iso
/
pluginy Firefox
/
722
/
722.xpi
/
chrome
/
noscript.jar
/
content
/
noscript
/
PlacesPrefs.js
< prev
next >
Wrap
Text File
|
2010-02-12
|
8KB
|
249 lines
var PlacesPrefs = {
QueryInterface: xpcom_generateQI([CI.nsINavBookmarkObserver, CI.nsISupportsWeakReference, CI.nsISupports]),
bmsvc: CC["@mozilla.org/browser/nav-bookmarks-service;1"].getService(CI.nsINavBookmarksService),
annsvc: CC["@mozilla.org/browser/annotation-service;1"].getService(CI.nsIAnnotationService),
LEGACY_NAME: "* NoScript Configuration",
NAME: "[NoScript]",
PROP: "bookmarkProperties/description",
dump: function(msg) {
if (ns.consoleDump) ns.dump("Bookmark-Sync - " + msg);
},
get uri() {
delete this.uri;
var tpl = '<h1>%title%</h1><p>%message%</p>';
for each(var l in ["title", "message"]) {
tpl = tpl.replace('%' + l + '%', ns.getString("bookmarkSync." + l).replace(/</g, '<').replace(/>/g, '>'));
}
return this.uri = IOS.newURI(
'data:text/html;charset=UTF-8,' + encodeURIComponent(tpl.replace(/\b(Weave)\b/, '<a href="http://labs.mozilla.com/projects/weave/">$1</a>')
.replace(/\b(XMarks(\s+extension)?)\b/i, '<a href="https://addons.mozilla.org/en-US/firefox/addon/2410">$1</a>'))
, null, null);
},
init: function() {
this.wrappedJSObject = this;
this.bmsvc.addObserver(this, false);
},
dispose: function(ns) {
this.bmsvc.removeObserver(this, false);
},
onItemAdded: function(aItemId, aFolder, aIndex) {
this.sync(aItemId, aFolder, '');
},
onItemChanged: function(aBookmarkId, aProperty, aIsAnnotationProperty, aValue) {
if (aProperty == "uri" || aIsAnnotationProperty && aProperty == this.PROP)
this.sync(aBookmarkId, null, aValue);
},
onItemRemoved: function(id, folderId, index) {
if (id == this._lastId || id == this._lastFolderId) {
this._lastId = this._lastFolderId = -1;
}
},
onBeginUpdateBatch: function() {},
onEndUpdateBatch: function() {},
onItemVisited: function() {},
onItemMoved: function() {},
onBeforeItemRemoved: function() {},
_lastId: -1,
_lastFolderId: -1,
_trans: false,
_doTransaction: function(callback, args) {
if (!ns.getPref("placesPrefs")) return;
if (this._trans) return;
var t = Date.now();
var ret = false;
try {
this._trans = true;
this.bmsvc.runInBatchMode({ runBatched: function(pp) { ret = callback.apply(pp.wrappedJSObject, args); } }, this);
} catch(e) {
this.dump("Transaction failed: " + e);
} finally {
this._trans = false;
if (ret) this.dump("Transaction done in " + (Date.now() - t) + "ms");
}
},
sync: function(id, folderId, url) {
if (url && !/^(?:https:\/\/void\.noscript\.|data:[\s\S]*%7B[\s\S]*%7D)/.test(url)) return;
this._doTransaction(this._syncInternal, [id, folderId, url]);
},
_syncInternal: function(id, folderId, url) {
var svc = this.bmsvc;
try {
var name = svc.getItemTitle(id);
if (name != this.NAME && name != this.LEGACY_NAME) return false;
if (!folderId) folderId = svc.getFolderIdForItem(id);
name = svc.getItemTitle(folderId);
if (name != this.NAME && name != this.LEGACY_NAME) return false;
if (id != this._lastId) {
if (this._lastId > -1) svc.removeItem(this._lastId);
if (name == this.NAME) this._lastId = id;
}
if (folderId != this._lastFolderId) {
if (this._lastFolderId > -1) svc.removeFolder(this._lastFolderId);
if (name == this.NAME) this._lastFolderId = this.id;
}
legacy = true;
var uri = (url || folderId) && svc.getBookmarkURI(id) || null;
if (uri && (uri instanceof CI.nsIURL) && uri.host == 'void.noscript.net') {
// legacy querystring + hash parsing, see 1.9.2
var qs = uri.query.replace(/^\?/, '').split("&");
var couple;
for each (var parm in qs) {
couple = parm.split("=");
ns.setPref(couple[0], decodeURIComponent(couple[1]));
}
ns.policyPB.setCharPref("sites", decodeURIComponent(uri.ref));
} else {
var data = null;
if (uri) {
var conf = decodeURIComponent(uri.path).match(/\{[\s\S]*\}/);
if (conf) data = { conf: conf && conf[0], ts: '' };
}
data = data || this.getData(id);
if (!(data && data.conf)) return false;
if (data.ts) legacy = false;
this._load(data);
}
if (legacy) this._trans = false; // force conversion
ns.savePrefs();
this.dump("Retrieve");
return true;
} catch(e) {
this.dump("Retrieve error: " + e);
}
return false;
},
_load: function(data) {
if (data.ts) ns.setPref("placesPrefs.ts", data.ts);
return ns.restoreConf(data.conf);
},
save: function() {
this._doTransaction(this._saveInternal, []);
},
_saveInternal: function() {
var id = -1;
var svc = this.bmsvc;
try {
var oldData;
if (this._lastId > -1) try {
oldData = this.getData(this._lastId);
if (oldData) id = this._lastId;
} catch (missingBookmark) {}
if (id < 1) {
var parentId = svc.bookmarksMenuFolder;
var folderId = svc.getChildFolder(parentId, this.NAME);
if (folderId < 1) {
try {
svc.removeFolder(svc.getChildFolder(parentId, this.LEGACY_NAME));
} catch(missingLegacy) {}
folderId = svc.createFolder(parentId, this.NAME, -1);
}
this._lastFolderId = folderId;
try {
id = svc.getIdForItemAt(folderId, 0);
} catch(e) {
id = -1;
}
}
if (id > -1) {
oldData = oldData || this.getData(id);
if (oldData && oldData.ts != ns.getPref("placesPrefs.ts")) {
var date = new Date();
date.setTime(oldData.ts.substring(1));
if (CC["@mozilla.org/embedcomp/prompt-service;1"
].getService(CI.nsIPromptService).confirm(DOM.mostRecentBrowserWindow,
ns.getString("bookmarkSync.title"), ns.getString("bookmarkSync.confirm", [date.toLocaleString()]))
) {
this._load(oldData);
ns.savePrefs();
return false;
}
}
}
var conf = ns.serializeConf();
var uri = this.uri;
if (id > -1) {
if (oldData && oldData.conf == conf) return true;
var oldURI = svc.getBookmarkURI(id);
if (!uri.equals(oldURI)) svc.changeBookmarkURI(id, uri);
} else {
id = svc.insertBookmark(folderId, uri, 0, this.NAME);
}
this.setData(id, { ts: '#' + Date.now(), conf: conf });
this._lastId = id;
this.dump("Persist");
return true;
} catch(e) {
this.dump("Persist error: " + e);
}
return true;
},
_getRawData: function(id) {
try {
return this.annsvc.getItemAnnotation(id, this.PROP);
} catch(e) {
return null;
}
},
_setRawData: function(id, value) {
this.annsvc.setItemAnnotation(id, this.PROP, value, 0, this.annsvc.EXPIRE_NEVER);
this.bmsvc.setItemLastModified(id, (new Date()).getTime() * 1000);
},
getData: function(id) {
var raw = this._getRawData(id);
var match = raw && raw.match(/^NoScript_Conf(#\d+)#(\{[\s\S]+\})/);
return match && { ts: match[1], conf: match[2] };
},
setData: function(id, value) {
this._setRawData(id, "NoScript_Conf" + value.ts + "#" + value.conf);
ns.setPref("placesPrefs.ts", value.ts);
}
}